<?php
/**
 * サイトコントローラ画面モジュール
 * （サイト利用開始登録業務）
 */
require_once dirname(__FILE__) . '/../models/Site.php';
require_once 'Mail/send_function.php';
require_once 'Request/Request.php';
require_once 'Storage/diskunit.php';
require_once 'Storage/binder.php';

/**
 * サイト画面こんとろーら
 */
class SiteController extends Zend_Controller_Action
{
	/** 入力フォーム：入力フォーム名 */
	const INPUT_FORM_NAME = 'signup';
	/** 入力フォーム：チーム名 */
	const INPUT_FORM_TEAMNAME = 'teamname';
	/** 入力フォーム：パスワード */
	const INPUT_FORM_PASSWORD = 'password';
	/** 入力フォーム：メールアドレス */
	const INPUT_FORM_MAILADDRESS = 'mail';
	/** 入力フォーム：チーム所有サイロURL */
	const INPUT_FORM_TEAMSITE_URL = 'teamsiteurl';
	/** バインダーラベル：サイト利用申し込み用紙 */
	const BINDER_LABEL_REGIST = "サイト利用申込用紙";

	/**
	 * サインアップ画面
	 * application/views/scripts/site/signup.tpl
	 */
	public function signupAction()
	{
		$this->view->formAction = 'http://'.$this->createUrlFromActionController('confirm');
	}

	/**
	 * 入力項目確認画面
	 * ・登録済みメールアドレスの場合は拒否
	 */
	public function confirmAction()
	{
		$this->view->cancelAction = 'http://' . $this->createUrlFromActionController('signup');
		$this->view->nextAction = 'http://' . $this->createUrlFromActionController('preregist');
		$this->view->mailAddressDupulicateFlg = FALSE;
		if ($this->mailAddressExists($_REQUEST[self::INPUT_FORM_MAILADDRESS])) {
			$this->view->mailAddressDupulicateFlg = TRUE;
		}
	}

	/**
	 * メールアドレスが登録済みの場合TRUEを返す
	 * @param string $mailAddress
	 */
	static public function mailAddressExists($mailAddress)
	{
		$pages = self::getBinder()->get_pages();
		/*** 登録用紙全件捜査 */
		foreach ($pages as $page) {
			/*** 一致判定 */
			if ($page->isYou('_mailAddress', $mailAddress, object::SELECT_AGREE)) {
				/*** 削除されていないければ一致 */
				if ($page->isYou('_deleteFlg', FALSE, object::SELECT_AGREE)) {
					return TRUE;
				}
			}
		}
		return FALSE;
	}

	/**
	 * 仮登録完了画面
	 * 1.仮登録メール送信
	 * 2.仮登録情報を保存
	 * 3.画面表示
	 */
	public function preregistAction()
	{

		/*** 仮登録記載 */
		$preRegistPaper= $this->_bindPreregist();
		/*** 仮登録メール送信 */
		$this->_sendPreregistMail($preRegistPaper);
	}

	/**
	 * 本登録画面
	 * ・IDが一致する登録情報の仮登録フラグを本登録に変移行する
	 * application/views/scripts/site/regist.tpl
	 */
	public function registAction()
	{
		$pages = $this->getBinder()->get_pages();
		/*** 不正UIDの場合エラーメッセージを表示 */
		if (!isset($pages[$_REQUEST['uid']])) {
			$this->_redirect('/Error');
			exit();
		}
		/*** 仮登録を本登録に変更してバインダーに綴じる */
		$pages[$_REQUEST['uid']]->set_preregist(FALSE);
		$this->getBinder()->bind($pages[$_REQUEST['uid']]);
		/*** スタッフログインURLを設定する */
		$this->view->staffLoginUrl = APPLICATION_WEB_PATH . 'Staff/login?uid=' . $_REQUEST['uid'];
		/*** 登録用紙を設定する */
		$this->view->paper = $pages[$_REQUEST['uid']];
	}

	/**
	 * UIDから仮登録記録用紙を取り出す
	 * @param unknown $uid
	 */
	static public function getPreRegistPaper($uid)
	{
		$pages = $this->getBinder()->get_pages();
		$paper = $pages[$uid];
		return $paper;
	}

	/**
	 * サイト利用登録チームバインダーを返す Models_Site
	 * @param $updateFlg バインダーを更新しない場合はFALSEを設定する
	 * @return Binder
	 */
	static public function getBinder($updateFlg=TRUE)
	{
		$storage = new Storage_Diskunit(APPLICATION_NAME, self::getSiteRegistBinderDir());
		$binder = new Binder(self::BINDER_LABEL_REGIST, $storage, $updateFlg);
		return $binder;
	}

	/**
	 * サイト利用登録チームバインダーを保存するディレクトリを返す
	 * @return string
	 */
	static public function getSiteRegistBinderDir()
	{
		return dirname(__FILE__).'/../files/';
	}

	/**
	 * 仮登録情報保存
	 */
	protected function _bindPreregist()
	{
		/*** 白紙の仮登録申込書にチーム名とパスワードを記載する */
		$preRegistPaper = new Models_Site(
				Lib_Request::get(self::INPUT_FORM_TEAMNAME),
				Lib_Request::get(self::INPUT_FORM_PASSWORD),
				Lib_Request::get(self::INPUT_FORM_MAILADDRESS),
				Lib_Request::get(self::INPUT_FORM_TEAMSITE_URL)
				);
		/*** 仮登録宣言設置 */
		$preRegistPaper->set_preregist(TRUE);
		/*** サイト利用申込用紙のバインダーを準備し仮登録申込書を綴じる */
		$binder = $this->getBinder();
		$binder->bind($preRegistPaper);

		return $preRegistPaper;
	}

	/**
	 * 仮登録完了メール送信
	 */
	protected function _sendPreregistMail(Models_Site $preRegistPaper)
	{
		$from = 'jsc@minder.minibird.jp';
		$subject = '少年サッカークラブマネージャーサイト利用開始確認メール';
		$registUrl = APPLICATION_WEB_PATH . 'Site/regist?uid='.$preRegistPaper->get_uid();
		$text = sprintf(SITE_CONTROLLER_MAIL_BODY01, $preRegistPaper->get_teamname(),$registUrl);
		$ret = Mail_send_function(Lib_Request::get(self::INPUT_FORM_MAILADDRESS), $subject, $text, $from);
		return $ret;
	}

	/**
	 * アクション名、コントローラ名、ドメイン名からＵＲＬを作成する
	 * @param string $action
	 * @param string $controller
	 * @param string $domain
	 * @return string
	 */
	public function createUrlFromActionController($action='', $controller='', $domain='')
	{
		/*** 引数未設定の項目は現状からＵＲＬを構築する */
		if ($action == ''){
			$action = $this->getRequest()->getActionName();
			$controller = $this->getRequest()->getControllerName();
			$domain = $_SERVER['HTTP_HOST'];
		} else if ($controller == '') {
			$controller = $this->getRequest()->getControllerName();
			$domain = $_SERVER['HTTP_HOST'];
		} else if ( $domain == '' ) {
			$domain = $_SERVER['HTTP_HOST'];
		}
		return implode('/', array($domain,$controller,$action));
	}
}

define('SITE_CONTROLLER_MAIL_BODY01',
<<<EOD
%s様
少年サッカークラブマネージャーサイト利用申し込みありがとうございます。
以下の、URLから利用本登録を実施してください。
%s
EOD
);